#define  _CRT_SECURE_NO_WARNINGS 1
#define ROW 4
#define COL 6
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
////****杨氏矩阵****
///*杨氏矩阵举例：
//    1 2 3
//    2 3 4
//    3 4 5
//
//    1 3 4
//    2 4 5
//    4 5 6
//
//    1 2 3
//    4 5 6
//    7 8 9*/
//
//    /* 1 2 3 4 5 6
//     2 5 7 8 9 10
//     4 6 8 9 10 11
//     6 7 9 11 12 14*/
//     //我们可以先和最右上角的数先比较，如果小于右上角的数，则去掉最右面的一列。
//     //如果大于最右上角的数，则去掉最上面的一行，慢慢的缩小数组缩小范围！！！
//
//     //如图是查找 12 的路径！
//    // 6小于12，所以12必定不在第一行，所以去掉。10，11也如此。到14的时候比12大，去掉这一列。因为14这一列下面如果还有数那也一定比12大，不需要这一列了，所以去掉
//    //。最后就找到12了！
//int Search( int a[][COL], int row, int col, int x)
//{
//    int i = 0;//从第0行开始找
//    int j = col - 1;//从第0行的最后一位开始找
//    while (i < row && j>0)//条件小于第row行,大于等于第0位
//    {
//        if (x > a[i][j])
//        {
//            i++;//大于最后一位，行数+1
//        }
//        else if (x < a[i][j])
//        {
//            j--;//小于最后一位，位数向前-1
//        }
//        else
//        {
//            return 1;//找到返回1值
//        }
//    }
//    return 0;//没找到返回值0
//}
//int main()
//{
//    int a[ROW][COL] = { {1 ,2, 3, 4 ,5 ,6},
//                    {2 ,5, 7 ,8 ,9 ,10},
//                    {4 ,6 ,8 ,9 ,10,11},
//                    {6 ,7 ,9 ,11, 12,14} };
//    int i = 12;
//    int row = sizeof(a) / sizeof(a[0]);
//    int col = sizeof(a[0]) / sizeof(a[0][0]);
//   int ret =  Search(a, row, col, i);
//   if (ret == 1)
//   {
//       printf("找到了\n");
//  }
//   else
//   {
//       printf("没找到\n");
//   }
//    return 0;
//}

//****字符串左旋****
//实现一个函数，可以左旋字符串中的k个字符。
//例如：
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB
//
//void LIFT(char* src, int k)
//{
//	int tmp;
//	assert(src != NULL);
//	while (k--)
//	{
//		char* cur = src;
//		tmp = *cur;
//		while (*(cur + 1) != '\0')//用'/0'控制转换截至
//		{
//			*cur = *(cur + 1);
//			cur++;
//		}
//		*cur = tmp;
//	}
//}
//
//int main()
//{
//	char arr[] = "ABCD";
//	int k=0;
//	scanf("%d", &k);
//	LIFT(arr, k);
//	printf("%s\n", arr);
//	return 0;
//}
//方法二：
#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void reverse(char* left, char* right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
	
}
void lift_move(char* arr, int k)
{
	int len = strlen(arr);
	k %= len;//防止k多次利用，超过字符串的长度
	//左边逆序
	reverse(arr, arr + k - 1);
	//右边逆序
	reverse(arr + k, arr + len - 1);
	//整体逆序
	reverse(arr, arr + len - 1);
}
int main()
{
	char arr[] = "abcdef";
	int k = 0;
	scanf("%d", &k);
	lift_move(arr, k);
	printf("%s\n", arr);
	return 0;
}

//****字符串旋转结果****
//写一个函数，判断一个字符串是否为另外一个字符串旋转之后的字符串。
//例如：给定s1 = AABCD和s2 = BCDAA，返回1
//给定s1 = abcd和s2 = ACBD，返回0.
//AABCD左旋一个字符得到ABCDA
//AABCD左旋两个字符得到BCDAA
//AABCD右旋一个字符得到DAABC

//void LEFT(char* src, int k)
//{
//	int tmp;
//	while (k--)
//	{
//		char* cur = src;
//		tmp = *cur;
//		while (*(cur + 1) != '\0')
//		{
//			*cur = *(cur + 1);
//			cur++;
//		}
//		*cur = tmp;
//	}
//
//}
//judge(char* s1, const char* s2)
//{
//	int i = 0;
//	if (strlen(s1) != strlen(s2))
//	{
//		return 0;
//	}
//	else
//	{
//		for (i = 0; i <= (strlen(s1) - 1); i++)
//		{
//			LEFT(s1, 2);
//			if (strcmp(s1 , s2)==0)
//			{
//				return 1;
//			}
//		}
//	}
//	return 0;
//}
//int main()
//{
//	char arr1[] = "AABCD";
//	char arr2[] = "BCDAA";
//
//	char arr3[] = "abcd";
//	char arr4[] = "ACBD";
//	int ret1 = judge(arr1, arr2);
//	int ret2 = judge(arr3, arr4);
//
//	printf("%d\n", ret1);
//	printf("%d\n", ret2);
//
//	return 0;
//}
//void print_arr(int arr[], int  sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int cmp_int(const void* e1, const void* e2)
//{
//	return *(int*)e1 - *(int*)e2;
//}
//void swap(char* buf1, char* buf2, int width)
//{
//	int i = 0;
//	for (i = 0; i < width; i++)
//	{
//		char temp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = temp;
//		buf1++;
//		buf2++;
//	}
//}
//void bubble_sort1(void* base, int num, int width, int(*cmp)(const void* e1, const void* e2))
//{
//	int i = 0;
//	for (i = 0; i < num-1; i++)
//	{
//		int j = 0;
//		for (j = 0; j < num - 1; j++)
//		{
//			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)
//			{
//				swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//			}
//		}
//	}
//}
//void test()
//{
//	int arr1[] = { 9,8,7,6,5,4,3,2,1,0};
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//	bubble_sort1(arr1, sz, sizeof(arr1), cmp_int);
//	//qsort(arr1, sz, sizeof(arr1[0]), cmp_int);
//	print_arr(arr1, sz);
//}
//int main()
//{
//	test();
//	return 0;
//}


//****测试与模拟实现qsort函数****
//void print_arr(int arr[], int  sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int cmp_int(const void* e1, const void* e2)
//{
//	return *(int*)e1 - *(int*)e2;
//}
//void swap(char* buf1, char* buf2, int width)
//{
//	int i = 0;
//	for (i = 0; i < width; i++)
//	{
//		char temp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = temp;
//		buf1++;
//		buf2++;
//	}
//}
//void bubble_sort1(void* base, int num, int width, int(*cmp)(const void* e1, const void* e2))
//{
//	int i = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		int j = 0;
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
//			{
//				swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//			}
//		}
//	}
//}
//void test()
//{
//	int arr1[] = { 9,8,7,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//	bubble_sort1(arr1, sz, sizeof(arr1[0]), cmp_int);
//	//qsort(arr1, sz, sizeof(arr1[0]), cmp_int);
//	print_arr(arr1, sz);
//}
//int main()
//{
//	test();
//	return 0;
//}

//****模拟实现strlen****
//int my_strlen(char* src, int sz)
//{
//	int count = 0;
//	while(*src != '\0')
//	{
//			count++;
//			src++;
//	}
//	
//	return count;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int ret = my_strlen(arr,sz);
//	printf("%d\n", ret);
//	return 0;
//}

//****模拟实现strcpy****
//char* my_strcpy(char* arr1, char* arr2)
//{
//	assert(arr1 && arr2);
//	char* ret = arr1;
//	//while(*arr2 != '\0')
//	//{
//	//	*arr1 = *arr2;
//	//	arr1++;
//	//	arr2++;
//	//}
//	//*arr1 = *arr2;
//
//	//优化
//	while (*arr1++ = *arr2++)
//	{
//		;
//	}
//	return ret;
//}
//int main()
//{
//	char arr1[20] = { 0 };
//	char* arr2 = "abcdef";
//	printf("%s\n", my_strcpy(arr1, arr2));
//	return 0;
//}

//****模拟实现strcmp****
//int my_strcmp(char* arr1, char* arr2)
//{
//	assert(arr1 && arr2);
//	while (*arr1 == *arr2)
//	{
//		if (*arr1 == '\0')
//		{
//			return 0;
//		}
//		arr1++;
//		arr2++;
//	}
//	if (*arr1 > *arr2)
//	{
//		return 1;
//	}
//	else
//	{
//		return -1;
//	}
//}
//int main()
//{
//	char arr1[] = "abcedf";
//	char arr2[] = "abcdfe";
//	my_strcmp(arr1, arr2);
//	printf("%d\n", my_strcmp(arr1, arr2));
//	return 0;
//}

//****模拟实现strcat****
//char* my_strcat(char* arr1, char* arr2)
//{
//	assert(arr1 && arr2);
//	char* ret = arr1;
//	while (*arr1)
//	{
//		arr1++;
//	}
//	while (*arr1++ = *arr2++)
//	{
//		;
//	}
//	return ret;
//}
//int main()
//{
//	char arr1[20] = "hello";
//	char arr2[] = " world";
//	my_strcat(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

//****模拟实现strstr****
char* my_strstr(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	const char* s1 = arr1;
	const char* s2 = arr2;
	char* cur = arr1;
	while (*cur)
	{
		s1 = cur;
		s2 = arr2;
		while (s1 && s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (arr2 != '\0')
		{
			return (char*)cur;
		}
		cur++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abcdefcdef";
	char arr2[] = "cdef";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到字符串\n");
	}
	else
	{
		printf("找到了字符串\n");
	}
	return 0;
}